/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[LoadingOrderWithStaticBlock.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package objectOriented;

/**
 * 
 * 类的加载顺序测试<br/>
 *
 * 类的加载执行顺序:<br/>
 * 1. 父类的静态代码块<br/>
 * 2. 父类的静态属性<br/>
 * 3. 子类的静态代码块<br/>
 * 4. 子类的静态属性<br/>
 * 5. 父类的初始化块<br/>
 * 6. 父类的构造方法<br/>
 * 7. 子类的初始化块<br/>
 * 8. 子类的构造方法<br/>
 * 对于显式初始化的非静态的成员变量和代码块, 按照声明的先后顺序执行<br/>
 * 对于显式初始化的静态的属性和方法, 按照声明的先后顺序进行执行<br/>
 * 
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
@SuppressWarnings("unused")
public class LoadingOrderWithStaticBlock {

	public static void main(String[] args) {
		ChildClass childClass = new ChildClass();
		// 静态代码块为何只会执行一次: 因为其是在类加载的时执行, 而每个类只会被加载一次
	}
}

/**
 * 父类
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 *
 */
@SuppressWarnings("unused")
class ParentClass {

	private final int p = 50;

	private static int pp = getNext(99);

	static {
		System.out.println("Parent static block...");
	}

	{
		System.out.println("Parent initial block...");
	}

	/**
	 * 构造方法
	 */
	public ParentClass() {
		System.out.println("Parent constructor...");
	}

	/**
	 * 获得下一个数字的值
	 * 
	 * @param base
	 *            基础数字
	 * @return 下一个数字的值
	 */
	public static int getNext(int base) {
		System.out.println("Parent static parameter initialized...");
		return ++base;
	}
}

/**
 * 子类
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 *
 */
@SuppressWarnings("unused")
class ChildClass extends ParentClass {

	private final int c = 100;

	static {
		System.out.println("Child static block...");
	}

	private static int cc = getNext(99);

	{
		System.out.println("Child initial block...");
	}

	/**
	 * 构造方法
	 */
	public ChildClass() {
		System.out.println("Child constructor...");
	}

	/**
	 * 获得下一个数字
	 * 
	 * @param base
	 *            基础数字
	 * @return 下一个数字的值
	 */
	public static int getNext(int base) {
		System.out.println("Child static parameter initialized...");
		return ++base;
	}
}
